<?php

class Doctrine_Model_PersonaDao extends Doctrine_Model_BaseDao {

    public function obtenerTodos() {
        return $this->getEntityManager()
                        ->createQuery('select p from Doctrine_Model_Entities_Persona p')
                        ->getResult();
    }

    public function obtenerPorId($id) {
        return $this->getEntityManager()->find('Doctrine_Model_Entities_Persona', $id);
    }
    
    public function obtenerEntreFechas($desde,$hasta) {
        return $this->getEntityManager()
                ->createQuery("select p from Doctrine_Model_Entities_Persona p WHERE p.fechaCreacion >= '".$desde." 00:00:00' and p.fechaCreacion <= '".$hasta." 23:59:59' ORDER BY p.fechaCreacion ASC ")
                ->getResult();
    }
    
    public function obtenerPorNroDocumento($nro_doc) {
        return $this->getEntityManager()
                        ->createQuery("SELECT p FROM Doctrine_Model_Entities_Persona p WHERE p.nroDocumento = " . $nro_doc)
                        ->getResult();
    }

    public function obtenerPorNombreApellido($nombres,$apellido) {
        return $this->getEntityManager()
                        ->createQuery("SELECT p FROM Doctrine_Model_Entities_Persona p WHERE p.nombres LIKE '%" . $nombres . "%' AND p.apellido LIKE '%" . $apellido. "%' ")
                        ->getResult();
    }

    public function obtenerPorTelefono($nro_telefono) {
        return $this->getEntityManager()
                        ->createQuery("SELECT c FROM Doctrine_Model_Entities_Persona c  JOIN c.telefonos t where t.numero LIKE '%" . $nro_telefono . "%'")
                        ->getResult();
    }

    public function obtenerPorCantidadCreditos($cantidad) {
        return $this->getEntityManager()
                        ->createQuery("SELECT p FROM Doctrine_Model_Entities_Persona p WHERE {$cantidad} >= (SELECT COUNT(c.id) FROM Doctrine_Model_Entities_Credito c WHERE c.cliente = p.id)")
                        ->getResult();
    }
    
    public function existeClienteConDocumento($nro_doc) {
        $array = $this->getEntityManager()
                ->createQuery("SELECT c FROM Doctrine_Model_Entities_Persona c WHERE c.nroDocumento = " . $nro_doc)
                ->getResult();
        if (count($array) > 0) {
            return true;
        } else {
            return false;
        }
    }

    public function obtenerPorApellido($apellido) {
        
        return $this->getEntityManager()
                        ->createQuery("SELECT c FROM Doctrine_Model_Entities_Persona c WHERE  c.apellido LIKE '" . $apellido . "%' ")
                        ->getResult();
    }

    public function obtenerPorNombres($nombres) {
        
        return $this->getEntityManager()
                        ->createQuery("SELECT c FROM Doctrine_Model_Entities_Persona c WHERE  c.nombres LIKE '" . $nombres . "%'")
                        ->getResult();
    }
    
    public function obtenerEntreFechaDeCreditoPorSucursal($desde, $hasta, $sucursal_id) {
        return $this->getEntityManager()
                        ->createQuery("SELECT DISTINCT p FROM Doctrine_Model_Entities_Persona p "
                                . " JOIN Doctrine_Model_Entities_Credito c ON c.cliente.id = p.id "
                                . " JOIN Doctrine_Model_Entities_Usuario u ON u.id = c.usuario.id "
                                . " JOIN Doctrine_Model_Entities_Sucursal s ON s.id = u.sucursal.id "
                                    . " WHERE c.fecha BETWEEN '{$desde->format("Y-m-d")}' AND '{$hasta->format("Y-m-d")}' "
                                    . " AND s.id = {$sucursal_id} "
                                . "ORDER BY p.apellido DESC")
                    ->setMaxResults(20)
                        ->getResult();
    }
    
    public function obtenerUltimosConCreditosActivos() {
        return $this->getEntityManager()
                        ->createQuery("SELECT c FROM Doctrine_Model_Entities_Persona c order by c.id desc")
                    ->setMaxResults(20)
                        ->getResult();
    }
    
    public function obtenerUltimosConCreditosActivosPorSucursal($sucursal_id) {
        return $this->getEntityManager()
                        ->createQuery("SELECT c FROM Doctrine_Model_Entities_Persona c JOIN c.creditos cre JOIN  cre.usuario u JOIN  u.sucursal s where s.id=".$sucursal_id." order by c.id desc")
                    ->setMaxResults(20)
                        ->getResult();
    }
    
    public function obtenerPorNumeroyTipoDeDocumento($numeroDeDocumento, $tipoDeDocumentoId) {
        if (isset($numeroDeDocumento) && isset($tipoDeDocumentoId)) {
            $result = $this->getEntityManager()
                    ->createQuery('select p from Doctrine_Model_Entities_Persona p JOIN p.tipoDocumento td where td.id = '.$tipoDeDocumentoId.' AND p.nroDocumento = '.$numeroDeDocumento)
                    ->getResult();
            return $result[0];
        } else {
            return NULL;
        }
    }
    
    public function obtenerPorEmpresa($empresa) {
        $qb = $this->getEntityManager()->createQueryBuilder();
        
        $qb->select("p");
        $qb->from("Doctrine_Model_Entities_Persona", "p");
        $qb->leftJoin("p.datosLaborales", "dl");
        $qb->where($qb->expr()->like('dl.empresa', $qb->expr()->literal("%{$empresa}%")));
            
        return $qb->getQuery()->getResult();
    }
    
    public function obtenerPorLugarDeTrabajo($lugar_de_trabajo) {
        $qb = $this->getEntityManager()->createQueryBuilder();
        
        $qb->select("p");
        $qb->from("Doctrine_Model_Entities_Persona", "p");
        $qb->leftJoin("p.datosLaborales", "dl");
        $qb->where($qb->expr()->like('dl.lugarDeTrabajo', $qb->expr()->literal("%{$lugar_de_trabajo}%")));
            
        return $qb->getQuery()->getResult();
    }
    
    public function guardar(Doctrine_Model_Entities_Persona $unCliente) {
        try {
           
            $this->getEntityManager()->persist($unCliente);
            $this->getEntityManager()->flush();
            return true;
        } catch (Exception $e) {
            echo ($e->xdebug_message);
            $logger = Zend_Registry::get('logger');
            $logger->log("Error:" . $e->getMessage(), Zend_Log::ERR);
            return false;
        }
    }
        
}

